from mitmproxy import ctx, websocket


import logging
import warnings

# 忽略所有 UserWarning 警告
warnings.filterwarnings("ignore", category=UserWarning)

# 1、设置全局的日志格式和级别
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
                    datefmt='%m/%d/%Y %H:%M:%S',
                    level=logging.INFO)

# 2、获取logger （给日志器起个名字 "__name__"）
logger = logging.getLogger(__name__)# __name__内置变量模块名称，轻松地识别出哪个模块产生了哪些日志消息（主程序模块）

# 3、创建文件处理器，指定日志文件和日志级别（局部）---文件输出FileHandle（输出到指定文件）
file_handler = logging.FileHandler('app1.log') #指定日志文件名application.log，默认在当前目录下创建
file_handler.setLevel(logging.INFO) # 设置日志级别(只输出对应级别INFO的日志信息)
# 设置日志格式
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s', '%m/%d/%Y %H:%M:%S'))

# 4、添加文件处理器到logger
logger.addHandler(file_handler)

# 训练模型的代码
epoch = 7
# 记录日志信息
logger.info("Get better performance at epoch {}".format(epoch))



class WebSocketModifier:
    def websocket_message(self, flow: websocket.WebSocketFlow):
        try:
            message = flow.messages[-1]
            if message.from_client:
                logger.info("客户端发送数据--------------------------------")
                # 检查消息类型
                if message.type == 2:
                    # 打印原始客户端二进制消息
                    logger.info(f"Original client binary message: {message.content}")
                    message.content
                    # cs
                    # c = b'\n\tWSPingReq'

                    m = b'\r\x00\x00\x00a\x14\x00\x00\x00x`\xfe\x8fA\x92\x01\x02'
                    if message.content.startswith(
                            b'\x19\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xa6HpProp\x01\x00'):
                        # 构建新的消息
                        # modified_content = b'\x1d\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xaaAttackProp\x01\x00'
                        m = b'\r\x00\x00\x00a\x14\x00\x00\x00x`\xfe\x8fA\x92\x01\x02'
                        # modifined_str = b'\r\x00\x00\x00a\x14\x00\x00\x00x`\xfe\x8fA\x92\x01\n'
                        logger.info(f"------------------找到以指定的字节开头--------------------: {message.content}")
                        # 替换消息内容
                        message.content = m

                        # 打印修改后的消息
                        logger.info(f"Modified client binary message: {message.content}")
                    # if c in message.content:
                    #     # 构建新的消息
                    #     modified_content = b'\x1d\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xaaAttackProp\x01\x00'
                    #     logger.info(f"------------------找到以指定的字节开头--------------------: {message.content}")
                    #     # 替换消息内容
                    #     message.content = modified_content
                    #
                    #     # 打印修改后的消息
                    #     logger.info(f"Modified client binary message: {message.content}")


                    # # 检查消息是否以指定的字节开头
                    # if message.content.startswith(b'\x19\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xa6HpProp\x01\x00'):
                    #
                    #     # 构建新的消息
                    #     modified_content = b'\x1d\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xaaAttackProp\x01\x00'
                    #     modifined_str = b'\r\x00\x00\x00a\x14\x00\x00\x00x`\xfe\x8fA\x92\x01\n'
                    #     logger.info(f"------------------找到以指定的字节开头--------------------: {message.content}")
                    #     # 替换消息内容
                    #     message.content = modifined_str
                    #
                    #     # 打印修改后的消息
                    #     logger.info(f"Modified client binary message: {message.content}")
            else:

                # 需要修改的原始数据
                logger.info("服务端发送数据--------------------------------")
                logger.info(f"Original master binary message: {message.content}")
                message.content
                # original_data = b'\xafnot enouth item'
                #
                # # 新的数据
                # new_data = b'\x0f\x00\x00\x00\xb1\xeb\x00\x00\x00x`\xfe\x8fA\x92\x00\xa2OK'
                #
                a1 = b'\xafitem not enough\xc4\x01\x80\xc4\x01\x80'
                b11 = b'=\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4)\x82\x00\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8*\xca\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x01\x80'
                b22 = b'\xc8\x00\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x84\xce\x00\xa8.\xb9\x81\x01\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@\x90\xe0\x00\x00\x00\x00\x00\xce\x00\xa8\xea2\x81\x01\xcb@L\x00\x00\x00\x00\x00\x00\xce\x00\xa8*\xca\x81\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x1d\x8b\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x048\xce\x03\x0b\x9a\xee\x81\x01\xcd\x048\xce\x03\x0b\x9a\xef\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x048N\x81\x01\x81\x01\x81\x00\xcd\x03\x0e'

                #
                # b = b'\xa1\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4y\x86\x00\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa9\x15)\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\x03\xbb\x01\xcb@I\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa9\xe0]\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x15\x81\x00\x83\x00\xce\x00\xa8\x03\xba\x01\xcbQ\xb1\xa0\xaf\xf8\x86P\xc6\x02\x00'
                # b2 = b'\x00\x01\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x85\xce\x00\xa8.\xb9\x81\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@r \x00\x00\x00\x00\x00\xce\x00\xa8\xea;\x81\x01\xcb@\x94\xb8\x00\x00\x00\x00\x00\xce\x00\xa8\x03\xba\x81\x01\xcbQ\xd6"\x1b\x0c\xe5E\x08\xce\x00\xa8\x03\xbb\x81\x01\xcb@\xb5\x9a\x00\x00\x00\x00\x00\x1d\x8e\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xeb\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xec\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xed\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xee\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xef\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x01"N\x82\x01\x81\x01\x81\x00\xcd\x02\xf9\x00\x81\xce\x00\xa9\xe0]\x81\x02\x02'
                #
                # b3 = b'8\x03\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4\xc9\x8a\x00\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8*\xc9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8*\xcb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\xea3\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xb7\x1bn\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa9\xe0q\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x06\x83\x00\xce\x00\xa8*\xc9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x07\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x08\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\t\x83\x00\xce\x00\xa9\xe4O\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc5\x02[\xde\x00\x1e\x00\x83\x00\xce\x00\xa8U\xca\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8Q\xe9\x01\xcb@\x08\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8U\xcf\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8U\xd1\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa8U\xd3\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8Q\xe7\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x06\x83\x00\xce\x00\xa8U\xcb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x07\x83\x00\xce\x00\xa8Q\xe0\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x08\x83\x00\xce\x00\xa8U\xd0\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\t\x83\x00\xce\x00\xa8Q\xe8\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\n\x83\x00\xce\x00\xa8Q\xea\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0b\x83\x00\xce\x00\xa8U\xcd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0c\x83\x00\xce\x00\xa8Q\xec\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\r\x83\x00\xce\x00\xa8\xa0\x03\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x0e\x83\x00\xce\x00\xa8\xa0\x06\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0f\x83\x00\xce\x00\xa8\xa0\x02\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x83\x00\xce\x00\xa8\x9f\xfb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x11\x83\x00\xce\x00\xa8\x9f\xfc\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x12\x83\x00\xce\x00\xa8\xa0\x04\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x13\x83\x00\xce\x00\xa8\xa0\x00\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x14\x83\x00\xce\x00\xa8\x9f\xfd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x15\x83\x00\xce\x00\xa8x\xec\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x16\x83\x00\xce\x00\xa8x\xff\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x17\x83\x00\xce\x00\xa8x\xea\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x18\x83\x00\xce\x00\xa8x\xf5\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x19\x83\x00\xce\x00\xa8x\xfd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1a\x83\x00\xce\x00\xa8x\xfb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1b\x83\x00\xce\x00\xa8y\x00\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1c\x83\x00\xce\x00\xa8x\xfe\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1d\x83\x00\xce\x00\xa8x\xef\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00'




                # logger.info(f"####################### Original data : {message.content}")

                if a1 in message.content:
                #
                    logger.info(f"okkkkkkkk Data modified successfully.")

                    new_messages = [
                        b'=\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4)\x82\x00\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8*\xca\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x01\x80',
                        b'\xc8\x00\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x84\xce\x00\xa8.\xb9\x81\x01\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@\x90\xe0\x00\x00\x00\x00\x00\xce\x00\xa8\xea2\x81\x01\xcb@L\x00\x00\x00\x00\x00\x00\xce\x00\xa8*\xca\x81\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x1d\x8b\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x048\xce\x03\x0b\x9a\xee\x81\x01\xcd\x048\xce\x03\x0b\x9a\xef\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x048\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x048N\x81\x01\x81\x01\x81\x00\xcd\x03\x0e'
                    ]
                #
                #     # 新的多条消息
                #     new_messages = [
                #         b'\xa1\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4y\x86\x00\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa9\x15)\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\x03\xbb\x01\xcb@I\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa9\xe0]\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x15\x81\x00\x83\x00\xce\x00\xa8\x03\xba\x01\xcbQ\xb1\xa0\xaf\xf8\x86P\xc6\x02\x00',
                #         b'\x00\x01\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x85\xce\x00\xa8.\xb9\x81\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@r \x00\x00\x00\x00\x00\xce\x00\xa8\xea;\x81\x01\xcb@\x94\xb8\x00\x00\x00\x00\x00\xce\x00\xa8\x03\xba\x81\x01\xcbQ\xd6"\x1b\x0c\xe5E\x08\xce\x00\xa8\x03\xbb\x81\x01\xcb@\xb5\x9a\x00\x00\x00\x00\x00\x1d\x8e\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xeb\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xec\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xed\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xee\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xef\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x01"N\x82\x01\x81\x01\x81\x00\xcd\x02\xf9\x00\x81\xce\x00\xa9\xe0]\x81\x02\x02',
                #         b'\n\x0eNewMessagePush\x12\xc7\x02\nu\n`\x08\x01\x12%C10050_serverId_C10050_partitionId_81\x1a"\xe6\x8d\xa2\xe5\x8d\xa1\xef\xbc\x8c\xe5\xa4\x9a\xe7\xba\xa2\xe6\xa1\x839\xef\xbc\x8c\xe7\xbc\xba\xe5\xa4\xa7\xe5\xb0\x8f\xe7\x8e\x8b \x01(\x86\xbb\xb8\xc8\x8e20\xbc\xa6\x83 @\xd4\x0cP\x00\x12\x11\x08\x93\x8d\xe7\xba\xef\xa3\x91\xb4!\x10\xcd\xbd\xb8\xc8\x8e2\x12\xcd\x01\x08\xbc\xa6\x83\x12\xc5\x01\x08\xbc\xa6\x83 \x12\x0c\xe5\xa4\xaa\xe4\xb8\x8a\xe5\x8d\x81\xe6\x88\x92\x18\xd4\x0c"\x02zh(\x01R\x06321505Z\x06\xe6\xb8\x85\xe9\x85\x92`\x01\xa2\x01\x0819010012\xa2\x06\x85\x01\x89\xa8userName\xac\xe5\xa4\xaa\xe4\xb8\x8a\xe5\x8d\x81\xe6\x88\x92\xa8playerId\xce\x04\x00\xd3<\xa7userPic\xa819010012\xa9guildName\xa6\xe6\xb8\x85\xe9\x85\x92\xaduserHeadFrame\xce\x00\xa9\xff\x88\xa5title\x00\xa6bubble\xce\x00\xaa\x07X\xa2fp\xcbG\xde:\x96\xce\xdd\xd6b\xa8serverId\xcd\x06T\xb2\x06\x00\x18\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01'
                #
                #     ]
                #
                    # 删除原始消息
                    flow.messages.pop()
                #
                    # 发送多条新消息
                    for new_message in new_messages:
                        # 创建新消息并设置内容
                        new_msg = websocket.WebSocketMessage(
                            type=2,  # 二进制消息类型
                            from_client=False,
                            content=new_message,

                        )
                        # 发送消息
                        flow.messages.append(new_msg)
                    logger.info("Data modified and split into multiple messages successfully.")
                #
                #
                # if original_data in message.content:
                #     logger.info("Original data found, modifying...")
                #     modified_message = new_data
                #     message.content = modified_message
                #     logger.info(f"Data modified successfully.: {message.content}")
                #


        except AttributeError as e:
            ctx.log.error(f"AttributeError: {e}")
        except Exception as e:
            ctx.log.error(f"Unexpected error: {e}")

    def websocket_error(self, flow: websocket.WebSocketFlow):
        # 处理 WebSocket 错误
        ctx.log.error(f"WebSocket error: {flow}")
        ctx.log.error(f"Messages: {flow.messages}")

addons = [
    WebSocketModifier()
]


